from typing import List, NamedTuple
import os

import jiayan



def get_resource_path(name: str) -> str:
    """
    获取特定资源文件的真实路径。
    """
    from app import app_path

    # 确定项目资源位置
    resources_path = os.path.realpath(os.path.join(
        app_path,
        "./jiayan_models"
    ))
    return os.path.realpath(
        os.path.join(
            resources_path,
            name
        )
    )

class BaseTextHelper:
    """
    基类。继承以创建一个进行文言文分词的类。
    """
    def __init__(self) -> None:
        pass
    def get_data(self, text:str) -> List:
        """
        传入一段 文言文
        返回 文言文分词的结果。
        """
        return []
    
class JiayanTextHelper(BaseTextHelper):
    """
    基于Jiayan库的分词与识别词语类型的功能，
    对文言文进行分词。
    """
    lm = None
    postagger = None
    def __init__(self) -> None:
        # 如果没有初始化模型，就初始化
        if not self.lm: self.lm = jiayan.load_lm(get_resource_path("jiayan.klm"))
        if not self.postagger:
            self.postagger = jiayan.CRFPOSTagger()
            self.postagger.load(get_resource_path("pos_model"))
        
        self.tokenizer = jiayan.CharHMMTokenizer(self.lm)

    def get_data(self, text: str) -> List:
        # 分词
        split = list( self.tokenizer.tokenize(text) )
        # 分析词性
        types = self.postagger.postag(split)
        
        return list(zip(split, types))
        